/*
 * ParametroPropiedad.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 21/10/2010, 16:23:38 PM
 */

package com.ufps.cuatro.modelo.representacion;

import com.ufps.cuatro.util.base.ObjectBase;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>ParametroPropiedad:</b></i> <p>Esta clase representa los Parametros que recibe
 * una propiedad de un Control Swing.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 21/10/2010
 * @see ObjectBase
 */
public class ParametroPropiedad extends ObjectBase{
    private static final long serialVersionUID = 2240541610079610833L;
     
    private boolean primitive;
    private boolean array;
    private String strClasspath;    
    private String strValue;
    private String strValueDefault;
    private String strMascara;    
    private String strRender;
    private String strEditor;
    private Class<?> objClazz;    

    /**
     * Constructor por defecto de la clase
     */
    public ParametroPropiedad() {
    }    
    
    /**
     * Constructor que inicializa las propiedades del Objeto.
     * @param id Identificador de definición en el archivo e propiedades.
     * @param classpath ClassPath o cadena de definición del Tipo de dato.
     * @param value Valor del Tipo de dato del Parametro.
     * @param mascara Formato del Tipo de dato Parametro.
     * @param primitive Indica si el Tipo de Dato del Parametro es Primitivo.
     * @param array Indica si el Tipo de Dato del Parametro es un array.
     * @param render ClassPath del Control Swing para visualizar el Parametro.
     * @param editor ClassPath del Control Swing para editar el Parametro.
     */
    public ParametroPropiedad(int id, String classpath, String value, String mascara, boolean primitive, boolean array, String render, String editor) {
        this.id = id;
        this.strClasspath = classpath;
        this.strValue = value;
        this.strValueDefault = value;
        this.strMascara = mascara;
        this.primitive = primitive;
        this.array = array;        
        this.strRender = render;
        this.strEditor = editor;        
        this.instance();
    }      

    /**
     * Devuelve el ClassPath o cadena de definición del Tipo de dato.
     * @return ClassPath o cadena de definición del Tipo de dato.
     */
    public String getStrClassPath() {
        return strClasspath;
    }

    private void instance(){
        try {
            if(!this.primitive){
                this.objClazz = Class.forName(strClasspath);
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ParametroPropiedad.class.getName()).log(Level.SEVERE, null, ex);
        }
    }   

    /**
     * Devuelve el Formato del Tipo de dato Parametro.
     * @return Formato del Tipo de dato Parametro.
     */
    public String getStrMascara() {
        return strMascara;
    }

    /** 
     * Devuelve el Formato del Tipo de dato Parametro.
     * @param strMascara Formato del Tipo de dato Parametro.
     */
    public void setStrMascara(String strMascara) {
        this.strMascara = strMascara;
    }

    /**
     * Indica si el Tipo de Dato del Parametro es Primitivo.
     * @return Estado que indica si el Tipo de Dato del Parametro es Primitivo.
     */
    public boolean isPrimitive() {
        return primitive;
    }

    /**
     * Establece el estado que indica si el Tipo de Dato del Parametro es Primitivo.
     * @param primitive Estado que indica si el Tipo de Dato del Parametro es Primitivo.
     */
    public void setPrimitive(boolean primitive) {
        this.primitive = primitive;
    }

    /**
     * Devuelve el Valor del Tipo de dato del Parametro.Este campo se incializa por defecto si el
     * Parametro lo requiere.
     * @return Valor del Tipo de dato del Parametro.
     */
    public String getStrValue() {
        return strValue;
    }

    /**
     * Establece el Valor del Tipo de dato del Parametro.
     * @param strValue Valor del Tipo de dato del Parametro.
     */
    public void setStrValue(String strValue) {
        this.strValue = strValue;
    }

    /**
     * Devuelve el Valor por defecto del Tipo de dato del Parametro.
     * @return Valor por defecto del Tipo de dato del Parametro.
     */
    public String getStrValueDefault() {
        return strValueDefault;
    }

    /**
     * Establece el Valor por defecto del Tipo de dato del Parametro.
     * @param strValueDefault Valor por defecto del Tipo de dato del Parametro.
     */
    public void setStrValueDefault(String strValueDefault) {
        this.strValueDefault = strValueDefault;
    }

    /**
     * Devuelve el ClassPath del Tipo de dato.
     * @return ClassPath del Tipo de dato.
     */
    public Class<?> getObjClazz() {
        return objClazz;
    }    

    /**
     * Devuelve el ClassPath del Control Swing para editar el Parametro.
     * @return ClassPath del Control Swing para editar el Parametro.
     */
    public String getStrEditor() {
        return strEditor;
    }

    /**
     * Establece el ClassPath del Control Swing para editar el Parametro.
     * @param strEditor ClassPath del Control Swing para editar el Parametro.
     */
    public void setStrEditor(String strEditor) {
        this.strEditor = strEditor;
    }

    /**
     * Devuelve el ClassPath del Control Swing para visualizar el Parametro.
     * @return ClassPath del Control Swing para visualizar el Parametro.
     */
    public String getStrRender() {
        return strRender;
    }

    /**
     * Establece el ClassPath del Control Swing para visualizar el Parametro.
     * @param strRender ClassPath del Control Swing para visualizar el Parametro.
     */
    public void setStrRender(String strRender) {
        this.strRender = strRender;
    }

    /**
     * Indica si el Tipo de Dato del Parametro es un array.
     * @return  Estado que indica si el Tipo de Dato del Parametro es un array.
     */
    public boolean isArray() {
        return array;
    }

    /**
     * Establece el estado que indica si el Tipo de Dato del Parametro es un array.
     * @param array Estado que indica si el Tipo de Dato del Parametro es un array.
     */
    public void setArray(boolean array) {
        this.array = array;
    }       

    /**
     * Establece el ClassPath del Tipo de dato.
     * @param objClazz ClassPath del Tipo de dato.
     */
    public void setObjClazz(Class<?> objClazz) {
        this.objClazz = objClazz;
    }   

    @Override
    public String toString() {
        try{
            return !primitive ? objClazz.getCanonicalName() : strClasspath;
        }catch(java.lang.NullPointerException ex){}
        return "";
    }

    @Override
    public int compareTo(Object o) {
        try{
            ParametroPropiedad obj = (ParametroPropiedad) o;
            if(this.id > obj.id) {
                return 1;
            }
            else if(this.id < obj.id) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
        return 0;
    }

    @Override
    public Object clone() {
        try{
            ParametroPropiedad objClon = null;        
            //----------------------------------------------------------
            //Primero se Clona la Referencia Local
            //----------------------------------------------------------
            objClon = (ParametroPropiedad) super.clone();        
            //----------------------------------------------------------
            //Ahora se hace la Clonación Profunda
            //----------------------------------------------------------
            if(this.strClasspath != null){
                ((ParametroPropiedad)objClon).strClasspath = new String(strClasspath.toCharArray());
                ((ParametroPropiedad)objClon).instance();
            }
            if(this.strEditor != null){
                ((ParametroPropiedad)objClon).strEditor = new String(strEditor.toCharArray());
            }
            if(this.strMascara != null){
                ((ParametroPropiedad)objClon).strMascara = new String(strMascara.toCharArray());
            }        
            if(strRender != null){
                ((ParametroPropiedad)objClon).strRender = new String(strRender.toCharArray());
            }
            if(strValue != null){
                ((ParametroPropiedad)objClon).strValue = new String(strValue.toCharArray());
            }
            if(strValueDefault != null){
                ((ParametroPropiedad)objClon).strValueDefault = new String(strValueDefault.toCharArray());
            }        
            return objClon;
        } catch(java.lang.NullPointerException ex){}
        return null;
    }   
    
}
